/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package gcs.modelo;

import gcs.persistencia.GestorRondas;
import gcs.util.GestionRondas;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.List;

/**
 *
 * @author Rafe
 */
public class Categoria {
    /*
     * 
     */
    public Campeonato campeonato;
    
    public Categoria(Campeonato campeonato){
        this.campeonato=campeonato;
    }
    
    public static final Comparator<ParticipanteCategoria> PUNTUACION_DESCENDENTE = new Comparator<ParticipanteCategoria>() {
        @Override
        public int compare(ParticipanteCategoria o1, ParticipanteCategoria o2) {
            Puntuacion p1 = ((ParticipanteCategoria) o1).puntuacion;
            Puntuacion p2 = ((ParticipanteCategoria) o2).puntuacion;
            return p1.compareTo(p2);
        }
    };
    
    public String nombre;
    public int id;
    
    public List<ParticipanteCategoria> participantesCategoria = new ArrayList<ParticipanteCategoria>();
    /*
     * 
     */
    
    public List<Ronda> rondas = new ArrayList<Ronda>();
    
    public void generarPrimeraRonda() throws Exception {
        if(rondas.isEmpty()){
            Ronda ronda = GestionRondas.generarPrimeraRonda(participantesCategoria, this);
            rondas.add(ronda);
            GestorRondas.guardar(ronda);
        }
    }
    
    public void cerrarRondaActual(){
        actualizarPuntuaciones();
        rondas.get(rondas.size()-1).cerrada=true;
        Collections.sort(participantesCategoria, PUNTUACION_DESCENDENTE);
        actualizarPosiciones();
    }
    
    private void actualizarPuntuaciones(){
        Iterator<ParticipanteCategoria> ipc = participantesCategoria.iterator();
        while (ipc.hasNext()) {
            ipc.next().actualizarPuntuacion();
        }
        ipc = participantesCategoria.iterator();
        while (ipc.hasNext()) {
            ipc.next().actualizarResistenciaOponentes();
        }
        ipc = participantesCategoria.iterator();
        while (ipc.hasNext()) {
            ipc.next().cerrarRonda();
        }
    }
    
    private void actualizarPosiciones(){
        Iterator<ParticipanteCategoria> ipc = participantesCategoria.iterator();
        int posicion = 1;
        int contador = 1;
        ParticipanteCategoria pc1;
        ParticipanteCategoria pc2;
        if (ipc.hasNext()) {
            pc1 = ipc.next();
            pc1.posicion = posicion;
            while (ipc.hasNext()) {
                contador++;
                pc2 = ipc.next();
                if (!pc1.puntuacion.equals(pc2.puntuacion)) {
                    posicion=contador;
                }
                pc2.posicion = posicion;
                pc1 = pc2;
            }
        }
    }
    
    public void generarSiguienteRonda() throws Exception {
        
        Ronda ronda = GestionRondas.generarRonda(participantesCategoria, getSiguienteNumeroDeRonda(),this);
        
        rondas.add(ronda);
        
        GestorRondas.guardar(ronda);
        
        
    }
    
    private int getSiguienteNumeroDeRonda(){
        return rondas.size() + 1;
    }

    @Override
    public String toString() {
        return nombre;
    }
    
}
